package frsf.cidisi.exercise.modelo.situationCalculus;

import java.util.List;

import frsf.cidisi.exercise.modelo.util.Coordenada;
import frsf.cidisi.exercise.modelo.util.Laberinto;
import frsf.cidisi.exercise.modelo.util.Orientacion;
import frsf.cidisi.exercise.modelo.util.Salida;
import frsf.cidisi.faia.agent.ActionFactory;
import frsf.cidisi.faia.agent.Perception;
import frsf.cidisi.faia.agent.situationcalculus.KnowledgeBase;
import frsf.cidisi.faia.agent.situationcalculus.SituationCalculusPerception;
import frsf.cidisi.faia.exceptions.PrologConnectorException;

public class AgenteEstado extends KnowledgeBase {
	
	private static int tam = 4;
	private Coordenada posAgente;
    private Orientacion orientacion;    
    private List<Coordenada> entradas;
    private List<Salida> salida;
    private List<Coordenada> posLlaves;
    private boolean tieneLlave;
    private Laberinto laberinto;
    private Coordenada entradaAgente;

    public AgenteEstado() throws PrologConnectorException {

		//TODO: Replace file name  
        super("logica.pl");

        this.initState();
    }

    @Override
    public ActionFactory getActionFactory() {
        return AgenteActionFactory.getInstance();
    }

    @Override
    public String getSituationPredicate() {
        return "actualSituation";
    }

    @Override
    public String getBestActionPredicate() {
        return "bestAction";
    }

    @Override
    public String getExecutedActionPredicate() {
        return "action";
    }

    @Override
    public void updateState(Perception p) {
        this.tell((SituationCalculusPerception) p);
    }

    @Override
    public void initState() {
       
		//TODO: Complete Method
    	this.addKnowledge("position(0,0,0)");
    	this.addKnowledge("orientacion(3,0)");
    	this.addKnowledge("tieneLlave(0,0)");
    	
		posAgente = new Coordenada(0,0);
		entradaAgente = new Coordenada(0,0);
		orientacion = new Orientacion(3);
		entradas = null;
		salida = null;
		posLlaves = null;
		tieneLlave = false;
		laberinto = new Laberinto(tam,tam);
		
    }

    @Override
    public String toString() {
        String str = "";

       //TODO: Complete Method
       
        return str;
    }
    
    public Coordenada getPosAgente(){
        return posAgente;
     }
     public void setposAgente(Coordenada posAgente){
        this.posAgente = posAgente;
     }

     public List<Coordenada> getentrada(){
        return entradas;
     }
     
     public Coordenada getEntradaAgente(){
    	 return this.entradaAgente;
     }
     
     public void setentrada(List<Coordenada> entradas){
        this.entradas = entradas;
     }

     public List<Coordenada> getPosLlaves(){
        return posLlaves;
     }
     public void setPosLlaves(List<Coordenada> posLlaves){
        this.posLlaves = posLlaves;
     }
     public boolean getTieneLlave(){
        return tieneLlave;
     }
     public void setTieneLlave(boolean tieneLlave){
        this.tieneLlave = tieneLlave;
     }
     public Laberinto getLaberinto(){
        return laberinto;
     }
     public void setLaberinto(Laberinto laberinto){
        this.laberinto = laberinto;
     }

	public void setSalida(List<Salida> salida) {
		this.salida = salida;
	}

	public List<Salida> getSalida() {
		return salida;
	}

	public void setOrientacion(Orientacion orientacion) {
		this.orientacion = orientacion;
	}

	public Orientacion getOrientacion() {
		return orientacion;
	}
	
	public void addLlave(Coordenada posicion) {
		this.posLlaves.add(posicion);
	}
	
	public void removeLlave(Coordenada posicion) {
		this.posLlaves.remove(posicion);
	}
	
	public void pasarNivel(){
		
	}

	public void setEntradaAgente(Coordenada coordenada) {
		this.entradaAgente = coordenada;		
	}
}
